﻿using Cotizav.Presentacion.WinForms.Equipo;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Cotizav.Presentacion.WinForms.Cotizacion.Cotizacion.Equipo
{
    public partial class Cotizacion_AgregarEquipo_Alquiler : Form
    {
        string moneda;
        decimal tipoCambio;
        List<Entidades.CotizacionDetalle> listaCotizacionDetalle;
        Entidades.CotizacionDetalle selCotizacionDetalle;

        bool esAlternativa; 

        private Entidades.CotizacionDetalle result;

        public Entidades.CotizacionDetalle Result
        {
            get { return result; }
            set { result = value; }
        }
        
        public Cotizacion_AgregarEquipo_Alquiler()
        {
            InitializeComponent();
        }

        public Cotizacion_AgregarEquipo_Alquiler(string m, decimal tc, List<Entidades.CotizacionDetalle> lista) : this()
        {
            moneda = m;
            tipoCambio = tc;
            listaCotizacionDetalle = lista;

            esAlternativa = false;
        }

        public Cotizacion_AgregarEquipo_Alquiler(string m, decimal tc, Entidades.CotizacionDetalle selCotDetalle) : this()
        {
            moneda = m;
            tipoCambio = tc;
            selCotizacionDetalle = selCotDetalle;

            //solo para agregar alternativa
            esAlternativa = true;
        }

        private void Cotizacion_AgregarEquipo_Alquiler_Load(object sender, EventArgs e)
        {
            if (esAlternativa)
            {
                //habilita metodo para copiar cotizacion detalle
                if (selCotizacionDetalle != null)
                {
                    LogicaNegocio.EquipoBLL equipoBLL = new LogicaNegocio.EquipoBLL();
                    Entidades.Equipo findEquipo = equipoBLL.Buscar("codigo", selCotizacionDetalle.CodigoEquipo).First();

                    if (findEquipo != null)
                    {
                        txtBusqueda.Text = findEquipo.NombreEquipo;
                        txtBusqueda.Tag = findEquipo;

                        LogicaNegocio.CaracteristicaBLL caracteristicaBLL = new LogicaNegocio.CaracteristicaBLL();
                        List<Entidades.Caracteristica> listaCaracteristica = caracteristicaBLL.Listar(findEquipo);
                        gridEspecTecnicas.DataSource = listaCaracteristica;
                        gridEspecTecnicas.ClearSelection();

                        switch (selCotizacionDetalle.TipoTarifa)
                        {
                            case "Dia":
                            case "Día":
                                cmbTipoTarifa.SelectedIndex = 0;
                                break;
                            case "Semana":
                                cmbTipoTarifa.SelectedIndex = 1;
                                break;
                            case "Mes":
                                cmbTipoTarifa.SelectedIndex = 2;
                                break;
                        }

                        txtCantidad.Text = selCotizacionDetalle.Cantidad.Value.ToString();
                        txtHoraTarifa.Text = selCotizacionDetalle.HoraTarifa.Value.ToString();
                        txtMontoTarifa.Text = selCotizacionDetalle.MontoTarifa.Value.ToString();
                        txtTarifa.Text = selCotizacionDetalle.Tarifa.Value.ToString();
                        txtDescuento.Text = selCotizacionDetalle.Dscto.Value.ToString();
                        txtTarifaTotal.Text = selCotizacionDetalle.TarifaTotal.Value.ToString();
                        checkDsctoDocumento.Checked = selCotizacionDetalle.DsctoEnDocumento.HasValue ?
                            selCotizacionDetalle.DsctoEnDocumento.Value == 1 ? true : false : false;

                        btnBuscar.Enabled = false;
                    }
                }
            }
        }



        private void btnBuscar_Click(object sender, EventArgs e)
        {
            BuscarEquipo iuDialog = new BuscarEquipo();
            DialogResult dr = iuDialog.ShowDialog();

            if(dr == DialogResult.OK)
            {
                Entidades.Equipo selectedEquipo = iuDialog.Result;

                if (selectedEquipo != null)
                {
                    Entidades.CotizacionDetalle query = listaCotizacionDetalle.Find(x => x.CodigoEquipo.Trim().Equals(selectedEquipo.CodigoEquipo.Trim()));

                    if (query == null)
                    {
                        txtBusqueda.Text = selectedEquipo.NombreEquipo;
                        txtBusqueda.Tag = selectedEquipo;

                        //listamos sus caracteristicas
                        LogicaNegocio.CaracteristicaBLL caracteristicaBLL = new LogicaNegocio.CaracteristicaBLL();
                        List<Entidades.Caracteristica> listaCaracteristica = caracteristicaBLL.Listar(selectedEquipo);

                        gridEspecTecnicas.DataSource = null;
                        gridEspecTecnicas.DataSource = listaCaracteristica;
                        gridEspecTecnicas.ClearSelection();

                        //cargamos las tarifas
                        LogicaNegocio.ListaTarifaBLL listaTarifaBLL = new LogicaNegocio.ListaTarifaBLL();
                        Entidades.ListaTarifa listaTarifa = listaTarifaBLL.Listar(selectedEquipo);
                        gbTarifas.Tag = listaTarifa;
                    }
                    else
                    {
                        MessageBox.Show("El equipo ya se encuentra en el detalle de la cotización.", "Cotizav", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                    }
                }
            }
        }

        private void gridEspecTecnicas_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
        {
            if (gridEspecTecnicas.DataSource != null)
            {
                gridEspecTecnicas.Columns["IdCaracteristica"].Visible = false;
                gridEspecTecnicas.Columns["IdEquipo"].Visible = false;
                gridEspecTecnicas.Columns["NombreCaracteristica"].HeaderText = "Caracteristica";
                gridEspecTecnicas.Columns["Descripcion"].HeaderText = "Descripción";
                gridEspecTecnicas.Columns["Statusflag"].Visible = false;
                gridEspecTecnicas.Columns["Activo"].Visible = false;
            }
        }

        private void cmbTipoTarifa_SelectionChangeCommitted(object sender, EventArgs e)
        {
            if (cmbTipoTarifa.SelectedIndex > 0)
            {
                if (gbTarifas.Tag != null)
                {
                    string selTipoTarifa = cmbTipoTarifa.SelectedItem.ToString().ToUpper();
                    Entidades.ListaTarifa listaTarifa = gbTarifas.Tag as Entidades.ListaTarifa;

                    switch (selTipoTarifa)
                    {
                        case "DÍA":
                        case "DIA":
                            txtHoraTarifa.Text = listaTarifa.HoraxDia.HasValue ? listaTarifa.HoraxDia.Value.ToString() : "0";
                            txtMontoTarifa.Text = moneda.ToUpper() ==
                                listaTarifa.Moneda.ToUpper() ? listaTarifa.TarifaHoraDia.Value.ToString("N") :
                                moneda.ToUpper().Equals("LOCAL") ? (listaTarifa.TarifaHoraDia.Value * tipoCambio).ToString("N") :
                                moneda.ToUpper().Equals("EXTRANJERA") ? (listaTarifa.TarifaHoraDia.Value / tipoCambio).ToString("N") : "0";
                            txtTarifa.Text = (decimal.Parse(txtHoraTarifa.Text) * decimal.Parse(txtMontoTarifa.Text)).ToString("N");
                            break;
                        case "SEMANA":
                            txtHoraTarifa.Text = listaTarifa.HoraxSemana.HasValue ? listaTarifa.HoraxSemana.Value.ToString() : "0";
                            txtMontoTarifa.Text = moneda.ToUpper() ==
                                listaTarifa.Moneda.ToUpper() ? listaTarifa.TarifaHoraSemana.Value.ToString("N") :
                                moneda.ToUpper().Equals("LOCAL") ? (listaTarifa.TarifaHoraSemana.Value * tipoCambio).ToString("N") :
                                moneda.ToUpper().Equals("EXTRANJERA") ? (listaTarifa.TarifaHoraSemana.Value / tipoCambio).ToString("N") : "0";
                            txtTarifa.Text = (decimal.Parse(txtHoraTarifa.Text) * decimal.Parse(txtMontoTarifa.Text)).ToString("N");
                            break;
                        case "MES":
                            txtHoraTarifa.Text = listaTarifa.HoraxMes.HasValue ? listaTarifa.HoraxMes.Value.ToString() : "0";
                            txtMontoTarifa.Text = moneda.ToUpper() ==
                                listaTarifa.Moneda.ToUpper() ? listaTarifa.TarifaHoraMes.Value.ToString("N") :
                                moneda.ToUpper().Equals("LOCAL") ? (listaTarifa.TarifaHoraMes.Value * tipoCambio).ToString("N") :
                                moneda.ToUpper().Equals("EXTRANJERA") ? (listaTarifa.TarifaHoraMes.Value / tipoCambio).ToString("N") : "0";
                            txtTarifa.Text = (decimal.Parse(txtHoraTarifa.Text) * decimal.Parse(txtMontoTarifa.Text)).ToString("N");
                            break;
                    }

                    //calculamos el descuento y por defecto asigna el total
                    calcularDescuento();
                }
            }
        }

        #region Tarifa

        private void calcularTarifa()
        {
            if (!string.IsNullOrWhiteSpace(txtHoraTarifa.Text) || !string.IsNullOrWhiteSpace(txtMontoTarifa.Text))
            {
                try
                {
                    if (txtHoraTarifa.Text != ".")
                    {                        
                        if (txtMontoTarifa.Text != ".")
                        {
                            decimal numDia = decimal.Parse(txtHoraTarifa.Text);

                            //calculamos la tarifa
                            decimal tarifa = decimal.Parse(txtMontoTarifa.Text);
                            decimal tarifaxDia = numDia * tarifa;
                            txtTarifa.Text = tarifaxDia.ToString("N");
                        }
                        else
                        {
                            txtMontoTarifa.ResetText();

                            txtTarifa.ResetText();
                            txtDescuento.ResetText();
                            txtTarifaTotal.ResetText();
                        }
                    }
                    else
                    {
                        txtHoraTarifa.ResetText();

                        txtTarifa.ResetText();
                        txtDescuento.ResetText();
                        txtTarifaTotal.ResetText();
                    }
                }
                catch (FormatException)
                {
                    if (txtHoraTarifa.Text != "." && txtHoraTarifa.Text.Count(x => x == '.') > 1)
                    {
                        txtHoraTarifa.ResetText();
                    }


                    if (txtMontoTarifa.Text != "." && txtMontoTarifa.Text.Count(x => x == '.') > 1)
                    {
                        txtMontoTarifa.ResetText();
                    }

                    //reseteamos los campos calculados
                    txtTarifa.ResetText();
                    txtDescuento.ResetText();
                    txtTarifaTotal.ResetText();
                }
                finally
                {
                    this.calcularDescuento();
                }
            }
            else
            {
                //if (string.IsNullOrWhiteSpace(txtMontoTarifa.Text))
                //{
                //    txtTarifa.ResetText();
                //    txtTarifaTotal.ResetText();
                //}
                //else
                //{
                    txtHoraTarifa.ResetText();
                    txtTarifa.ResetText();
                    txtValDscto.ResetText();
                    txtDescuento.ResetText();
                    txtTarifaTotal.ResetText();
                //}
            }
        }

        private void calcularDescuento()
        {
            if (!string.IsNullOrWhiteSpace(txtValDscto.Text))
            {
                if (!string.IsNullOrWhiteSpace(txtTarifa.Text))
                {
                    try
                    {
                        if (txtValDscto.Text != ".")
                        {
                            decimal tarifa = decimal.Parse(txtTarifa.Text);
                            decimal dscto = decimal.Parse(txtValDscto.Text) / 100;
                            decimal valDscto = tarifa * dscto;

                            txtDescuento.Text = valDscto.ToString("N");
                        }
                        else
                        {
                            txtValDscto.ResetText();
                            txtDescuento.ResetText();

                            if (!string.IsNullOrWhiteSpace(txtTarifa.Text))
                            {
                                txtTarifaTotal.Text = txtTarifa.Text;
                            }
                        }
                        
                    }
                    catch (FormatException)
                    {
                        if (txtValDscto.Text != "." && txtValDscto.Text.Count(x => x == '.') > 1)
                        {
                            txtValDscto.ResetText();
                            txtDescuento.ResetText();

                            if (!string.IsNullOrWhiteSpace(txtTarifa.Text))
                            {
                                txtTarifaTotal.Text = txtTarifa.Text;
                            }
                        }
                    }
                    finally
                    {
                        this.calcularTotalTarifa();
                    }
                }
                else
                {
                    txtValDscto.ResetText();
                    txtDescuento.ResetText();
                }
            }
            else
            {
                if (!string.IsNullOrWhiteSpace(txtTarifa.Text))
                {
                    txtTarifaTotal.Text = txtTarifa.Text;
                    txtDescuento.ResetText();
                }
            }
        }

        private void calcularTotalTarifa()
        {
            if (!string.IsNullOrWhiteSpace(txtTarifa.Text) && !string.IsNullOrWhiteSpace(txtDescuento.Text))
            {
                txtTarifaTotal.Text = (decimal.Parse(txtTarifa.Text) - decimal.Parse(txtDescuento.Text)).ToString("N");
            }
            else
            {
                if (string.IsNullOrWhiteSpace(txtTarifa.Text) || string.IsNullOrWhiteSpace(txtDescuento.Text))
                {
                    txtTarifaTotal.Text = txtTarifa.Text;
                }
            }
        }

        private void txtnumDia_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (char.IsDigit(e.KeyChar) || char.IsControl(e.KeyChar) || e.KeyChar == '.')
            {
                e.Handled = false;
            }
            else
            {
                e.Handled = true;
            }
        }

        private void txtnumDia_KeyUp(object sender, KeyEventArgs e)
        {
            this.calcularTarifa();
        }

        private void txtTarifaHoraDia_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (char.IsDigit(e.KeyChar) || char.IsControl(e.KeyChar) || e.KeyChar == '.')
            {
                e.Handled = false;
            }
            else
            {
                e.Handled = true;
            }
        }

        private void txtTarifaHoraDia_KeyUp(object sender, KeyEventArgs e)
        {
            this.calcularTarifa();
        }

        private void txtValDscto_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (char.IsDigit(e.KeyChar) || char.IsControl(e.KeyChar) || e.KeyChar == '.')
            {
                e.Handled = false;
            }
            else
            {
                e.Handled = true;
            }
        }

        private void txtValDscto_KeyUp(object sender, KeyEventArgs e)
        {
            this.calcularDescuento();
        }

        #endregion

        private void btnAgregar_Click(object sender, EventArgs e)
        {
            bool correcto = false;

            if (txtBusqueda.Tag != null)
            {
                if (cmbTipoTarifa.SelectedIndex >= 0)
                {
                    if (!string.IsNullOrWhiteSpace(txtCantidad.Text))
                    {
                        if (!string.IsNullOrWhiteSpace(txtHoraTarifa.Text))
                        {
                            if (!string.IsNullOrWhiteSpace(txtMontoTarifa.Text))
                            {
                                if (gridEspecTecnicas.Rows.Count > 0)
                                {
                                    correcto = true;
                                }
                                else
                                {
                                    if (!esAlternativa)
                                    {
                                        DialogResult dr = MessageBox.Show("El Equipo no tiene características. ¿Continúa agregando el equipo?", "Cotizav", MessageBoxButtons.OKCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1);

                                        if (dr == DialogResult.OK)
                                        {
                                            correcto = true;
                                        }
                                    }
                                    else
                                    {
                                        correcto = true;
                                    }
                                }
                            }
                            else
                            {
                                MessageBox.Show("Ingrese valor en campo Tarifa por hora.", "Cotizav", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                            }
                        }
                        else
                        {
                            MessageBox.Show("Ingrese valor en campo Horas.", "Cotizav", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                        }
                    }
                    else
                    {
                        MessageBox.Show("Ingrese valor en campo Cantidad.", "Cotizav", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                    }
                }
                else
                {
                    MessageBox.Show("Ingrese valor en Tipo de Tarifa.", "Cotizav", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                }
            }
            else
            {
                MessageBox.Show("Seleccione el equipo para agregar a la cotización.", "Cotizav", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
            }

            if (correcto)
            {
                Entidades.CotizacionDetalle newCotizacionDetalle =
                    new Entidades.CotizacionDetalle()
                    {
                        IdEquipo = (txtBusqueda.Tag as Entidades.Equipo).IdEquipo,
                        NombreEquipo = (txtBusqueda.Tag as Entidades.Equipo).NombreEquipo,
                        CodigoEquipo = (txtBusqueda.Tag as Entidades.Equipo).CodigoEquipo,
                        Alternativa = esAlternativa ? 1 : 0,  //principal
                        Moneda = moneda,
                        TipoTarifa = cmbTipoTarifa.SelectedItem.ToString(),
                        Cantidad = Int32.Parse(txtCantidad.Text),
                        HoraTarifa = Int32.Parse(txtHoraTarifa.Text),
                        MontoTarifa = decimal.Parse(txtMontoTarifa.Text),
                        MontoTarifaExt = moneda.ToUpper().Equals("EXTRANJERA") ? decimal.Parse(txtMontoTarifa.Text) : (decimal.Parse(txtMontoTarifa.Text) * tipoCambio),
                        MontoTarifaLoc = moneda.ToUpper().Equals("LOCAL") ? decimal.Parse(txtMontoTarifa.Text) : (decimal.Parse(txtMontoTarifa.Text) / tipoCambio),
                        Tarifa = decimal.Parse(txtTarifa.Text),
                        TarifaExt = moneda.ToUpper().Equals("EXTRANJERA") ? decimal.Parse(txtTarifa.Text) : (decimal.Parse(txtTarifa.Text) * tipoCambio),
                        TarifaLoc = moneda.ToUpper().Equals("LOCAL") ? decimal.Parse(txtTarifa.Text) : (decimal.Parse(txtTarifa.Text) / tipoCambio),                        
                        Dscto = !string.IsNullOrWhiteSpace(txtDescuento.Text) ? decimal.Parse(txtDescuento.Text) : new decimal(0),
                        DsctoExt = !string.IsNullOrWhiteSpace(txtDescuento.Text) ? moneda.ToUpper().Equals("EXTRANJERA") ? decimal.Parse(txtDescuento.Text) : (decimal.Parse(txtDescuento.Text) * tipoCambio) : new decimal(0),
                        DsctoLoc = !string.IsNullOrWhiteSpace(txtDescuento.Text) ? moneda.ToUpper().Equals("LOCAL") ? decimal.Parse(txtDescuento.Text) : (decimal.Parse(txtDescuento.Text) / tipoCambio) : new decimal(0),
                        TarifaTotal = decimal.Parse(txtTarifaTotal.Text),
                        TarifaTotalExt = moneda.ToUpper().Equals("EXTRANJERA") ? decimal.Parse(txtTarifaTotal.Text) : (decimal.Parse(txtTarifaTotal.Text) * tipoCambio),
                        TarifaTotalLoc = moneda.ToUpper().Equals("LOCAL") ? decimal.Parse(txtTarifaTotal.Text) : (decimal.Parse(txtTarifaTotal.Text) / tipoCambio),
                        DsctoEnDocumento = checkDsctoDocumento.Checked ? 1 : 0,
                        Activo = 1
                    };

                result = newCotizacionDetalle;
                this.Close();                
            }            
        }

        private void txtCantidad_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (char.IsDigit(e.KeyChar) || char.IsControl(e.KeyChar))
            {
                e.Handled = false;
            }
            else
            {
                e.Handled = true;
            }
        }
    }
}
